Piszę mechanizm C#, aby przesłać plik do serwera Railsowego, używając Json.C# dodanie podwójnych cudzysłowów do początku i końca ciągu JSON skutkuje błędem dekodowania serwera
Zanim przejdziemy do części plików, jestem po prostu staramy się dodawać do serwera, i wydaje się mieć pewne problemy z ciągiem JSON, który pojawia się na serwerze ..
Co mogę robić źle ? Próbowałem już dwóch różnych sposobów serializacji ciągu znaków, a nawet załadowałem już serializowany ciąg ...
Zastanawiam się, czy ma to coś wspólnego z podwójnymi cudzysłowami zarówno na początku, jak i na końcu łańcucha widocznie wysyłanego na serwer i jak je usunąć z wniosku (bez cudzysłowów otaczających i korzystania RestClient z WizTools.org, to wszystko idzie w porządku ...):
MultiJson::DecodeError (757: unexpected token at '"{\"receipt\":{\"total\":100.0,\"tag_number\":\"xxxxx\",\"ispaperduplicate\":true},\"machine\":{\"serial_number\":\"111111\",\"safe_token\":\"1Y321a\"}}"')
Mój kod C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RestSharp;
using System.Web.Script.Serialization;
using Newtonsoft.Json;
namespace RonRestClient
{
class templateRequest
{
public Receipt receipt;
public class Receipt
{
public float total;
public String tag_number;
public bool ispaperduplicate = true;
public Receipt(float total, String tagnr)
{
this.total = total;
this.tag_number = tagnr;
}
};
public Machine machine;
public class Machine
{
public String serial_number;
public String safe_token;
public Machine(String machinenr, String safe_token)
{
this.serial_number = machinenr;
this.safe_token = safe_token;
}
};
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string path = @"C:\file.pdf";
string tagnr = "p94tt7w";
string machinenr = "2803433";
string safe_token = "123";
float total = 100;
templateRequest req = new templateRequest();
req.receipt = new templateRequest.Receipt(total, tagnr);
req.machine = new templateRequest.Machine(machinenr, safe_token);
//string json_body = JsonConvert.SerializeObject(req);
//string json_body = new JavaScriptSerializer().Serialize(req);
string json_body = @"{""receipt"" : {""total"":"[email protected]", ""tag_number"":"""[email protected]""",""ispaperduplicate"":true},""machine"":{""serial_number"": """[email protected]""", ""safe_token"": """[email protected]"""}}";
var client = new RestClient("http://localhost:3000");
var request = new RestRequest("/receipts",Method.POST);
//set request Body
request.AddHeader("Content-type", "application/json");
request.AddHeader("Accept", "application/json");
request.RequestFormat = DataFormat.Json;
request.AddBody(json_body);
//request.AddParameter("text/json", json_body, ParameterType.RequestBody);
// easily add HTTP Headers
// add files to upload (works with compatible verbs)
//request.AddFile("receipt/receipt_file",path);
// execute the request
IRestResponse response = client.Execute(request);
var content = response.Content; // raw content as string
if(response.ErrorMessage !="") content += response.ErrorMessage;
response_box.Text = content;
}
}
}
Awesome, nie tylko pomógł mi rozwiązać ten problem, jak udało Ci się zaproponować dwa różne rozwiązania mojego problemu. Skomentowałem to, ponieważ nie działało: użyłem 'text/json' zamiast' application/json'. W każdym razie, używając 'request.AddBody (req)' również robi sztuczkę ... Teraz muszę po prostu wymyślić jak dodać plik do struktury paragonu. Dzięki ! – MrWater
Jeśli 'request.AddBody (req)' działa, zdecydowanie sugeruję, że używasz tego, ponieważ jest to wyraźnie sposób, w jaki powinieneś używać RestSharp. –
Doskonale! Miałem dokładnie ten sam problem - googled to, pierwszy wynik to, boom! :) Dzięki! – albogdano