7

私はrubyでhttpspostリクエストを作成しようとしていますが、curlで機能しますが、rubyで400の不正なリクエストを受け取り、その理由を理解するのに苦労しています。

これがルビーコードです:

require 'rubygems'
require 'net/https'
require 'uri'
require 'json'

uri = URI.parse("https://api.parse.com/1/push")
http =  Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

req = Net::HTTP::Post.new(uri.host)
req['Content-Type'] = "application/json"
req['X-Parse-Application-Id'] = "abc123"
req['X-Parse-REST-API-Key'] = "abc123"

req.body = {:data => {:alert => "sup"}, :channels => ["notifications"]}.to_json

resp = http.start{|http| http.request(req)}

puts resp.inspect

これは私に#<Net::HTTPBadRequest 400 BAD_REQUEST readbody=true>応答を与えます。

しかし、同等のカールは問題なく機能します。

curl -X POST \
  -H "X-Parse-Application-Id: abc123" \
  -H "X-Parse-REST-API-Key: abc123" \
  -H "Content-Type: application/json" \
  -d '{
    "channels": [
      "notifications"
    ],
    "data": {
      "alert": "sup?"
    }
  }' \
  https://api.parse.com/1/push

私が間違っていることについて何か考えはありますか?

4

3 に答える 3

14

私にとって問題はSSL経由でリクエストを行うことではありませんでした。次の行を設定すると、すべてが機能しました。

http.use_ssl = true

これはOPの問題ではありませんでしたが、エラーメッセージは同じであり、このスレッドはエラーのGoogleヒットのトップの1つであるため、とにかく投稿しています。

于 2016-07-19T16:56:03.707 に答える
4

完全なURLを指定する必要があります。

req = Net::HTTP::Post.new("https://api.parse.com/1/push")
于 2013-01-29T20:17:18.033 に答える
0
def get_job(job_name)

        puts "Posting job #{job_name} to get test update order service"

        get_job_xml ="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns=\"http://os.uk/Test/GetUpdateOrders/1.0\">
       <soapenv:Header/>
       <soapenv:Body>
          <ns:GetTestUpdateOrdersReq>
             <ContractGroup>abc</ContractGroup>
             <ProductID>myproduct</ProductID>
             <Reference>#{job_name}</Reference>
          </ns:GetTestUpdateOrdersReq>
       </soapenv:Body>
    </soapenv:Envelope>"

        @http = Net::HTTP.new(@server, @port)


        request = Net::HTTP::Post.new(('/XISOAPAdapter/MessageServlet?senderParty=&senderService=faceNamespace=http://myco.uk/Test/GetUpdateOrders/1.0'), initheader = {'Content-Type' => 'text/xml'})
        request.basic_auth(@username, @password)
        request.content_type='text/xml'
        request.body = get_job_xml
        response = @http.request(request)


      end  

私はこのように私の方法とその働きを定義しました。

于 2016-02-08T11:26:58.113 に答える