【问题标题】:Return content type not supported from Twilio SMS apiTwilio SMS api 不支持返回内容类型
【发布时间】:2019-08-05 06:50:22
【问题描述】:

目前我正在处理一个需要向系统添加 SMS 检索功能的项目。我已经使用 spingboot 来构建应用程序。所有的实现都完成了,我已经按照 twillio 上的所有必要配置从客户端检索短信。当我向 Twilio api 发送短信时,它会在调试器中声明 Unsupported Media Type。我还将所需的内容类型发送到 api。 当我向 twilio 提供的号码发送短信时会发生这种情况。但是邮递员调用应用程序工作正常

package com.crustykrabs.application.service;

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import static spark.Spark.*;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;

@RestController
public class TextMessageController {

    @PostMapping(path = "/messages/textmessages/receive", consumes = "application/xml", produces = "application/xml")
    public @ResponseBody ResponseEntity<String> receive() {
            Body body = new Body
                    .Builder("The Robots are coming! Head for the hills!")
                    .build();
            Message sms = new Message
                    .Builder()
                    .body(body)
                    .build();
            MessagingResponse twiml = new MessagingResponse
                    .Builder()
                    .message(sms)
                    .build();
            return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(twiml.toXml());
    }
}

【问题讨论】:

  • 看起来你发送给你自己的控制器(而不是 Twilio)的不是application.xml,而只是一个常规的表单提交。您要向控制器发送什么请求? IN show 只需从映射中删除consumes。您正在执行常规表单提交而不是发送 xml。

标签: java spring spring-boot twilio twilio-api


【解决方案1】:

恕我直言,api 调用是最好的选择。请使用RestTemplate 对已发布的 API 进行实施,如下所示。

public void sendOTP() {
    RestTemplate restTemplate = new RestTemplate();

    String message = "Your PIN for account verification is 123456";
    String user = "******405e4c****19d0******";
    String password = "******";
    String smsurl = "https://api.twilio.com/2010-04-01/Accounts/"+user+"/Messages.json";

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("From", "+1334384****");
    map.add("To", "+999999999");
    map.add("Body", message);

    HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, headers);

    try {
        restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor(user, password));
        Object response = restTemplate.postForObject(smsurl, httpEntity, Object.class);
        LOG.info("Sms Response: {}", gson.toJson(response));
    } catch(Exception e) {
        LOG.error(e.getMessage());
    }
}

【讨论】:

    【解决方案2】:

    您认为客户端没有指定内容类型。请加content-type: application/xml

    如果你有spring boot,你可以通过添加以下依赖来修复它:

    <dependency>
         <groupId>com.fasterxml.jackson.dataformat</groupId>
         <artifactId>jackson-dataformat-xml</artifactId>
         <version>2.9.8</version>
    </dependency>
    

    【讨论】:

    • Thankz 赢了..但我将内容类型添加到响应中作为 contentType(MediaType.APPLICATION_XML)
    • 但是,响应正文中的消息被指定为“application/x-www-form-urlencoded”。我想详细了解您的请求/回复。
    • postman 请求发送到 api 时,内容类型为:application/xml。我认为问题在于 twilio api。
    • 如果你看上面的代码,你似乎处于没有请求和响应api调用的情况。如果你只想使用spring boot,你应该使用RestTemplate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2020-05-29
    • 2021-04-27
    • 2016-11-26
    • 2016-03-08
    • 2014-06-01
    相关资源
    最近更新 更多